package com.rongkang.interview.juc.volatiletest;

import java.util.concurrent.TimeUnit;

/**
 * @Description:  volatile的可见性测试
 * @author: 荣康
 * @date: 2021/11/30
 */

public class VolatileVisibilityDemo {
    public static void main(String[] args) {
        Student student = new Student();
        new Thread(()->{
            System.out.println(Thread.currentThread().getName() + " come in  --------");
            try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
            student.addMember();
            System.out.println(Thread.currentThread().getName() + "\t " + student.member);
        },"AAA").start();
        while (student.member == 0 ){
            //如果没有变化，这里就会一直卡着
        }
        System.out.println(Thread.currentThread().getName() +"\t thread is over  \t" + student.member);

    }

}
//验证volatile的可见性
/*如果不加volatile修饰的话，多线程情况下是无法保证可见性的，即当每个线程从主内存中复制变量之后，当一个线程拿取到这个值，
并且将其修改，其他的线程并不会同步，还是当时复制的主内存的那个值*/
/*当加上volatile修饰的时候，当一个线程从主内存中拿取之后，修改之后写会主内存，这时候主内存会发送消息给每个线程，每个线程会去主内存中拷贝数据
* 相当于一个通知的作用*/

class  Student{
  volatile   int member  = 0 ;
    public void addMember(){
        this.member = 60;
    }
}